#ifndef IMAGE_H
#define IMAGE_H
/**
 * \file Image.h
 * \brief Définit une Image
 * \author Romain Charbit
 *
 */
#include <GL/glut.h>

class Pixel;
class Histogramme;

struct FiltreLineaire{
	int taille;
	float *coef;
} ;

/*! \class Image
* \brief Classe Image RGB
*
*  La classe permet l'utilisation d'Image RGB
*/

class Image
{
public :
/*!
 *  \brief Constructeur
 *
 *  Constructeur de la classe Image
 *
 *  \param l : largeur de l'image
 *  \param h : hauteur de l'image
 */
	Image( int l=0, int h=0 );
/*!
 *  \brief Destructeur
 *
 *  Destructeur de la classe Image
 */
	~Image();
/*!
 *  \brief Ecrit un pixel
 *
 *  Methode qui permet d'écrire la valeur d'un pixel dans l'image
 *
 *  \param x : coordonnées en x du pixel a remplir
 *  \param y : coordonnées en y du pixel a remplir
 *  \param couleur : couleur du pixel a remplir
 *  \return void
 */
	void EcritPixel(int x, int y, Pixel couleur);
/*!
 *  \brief Lit un pixel
 *
 *  Methode qui permet de lire la valeur d'un pixel dans l'image
 *
 *  \param x : coordonnées en x du pixel a lire
 *  \param y : coordonnées en y du pixel a lire
 *  \return Retourne la couleur du pixel
 */
	Pixel LitPixel(int x, int y);
/*!
 *  \brief Filtre l'image
 *
 *  Methode qui permet de filtrer l'image en fonction du filtre passé en parametre. Creer le buffer data.
 *
 *  \param fl : filtre utilisé
 *  \return Retourne le résultat du filtrage
 */
	Image* FiltrageLineaire(FiltreLineaire *fl);
/*!
 *  \brief Calcul le laplacien
 *
 *  Methode qui permet de calculer le laplacien de l'image. Creer le buffer indirectement (le filtrage le fait).
 *
 *  \return void
 */
	Image* Laplacien();
/*!
 *  \brief Copie une image
 *
 *  Methode qui renvoi une copie de l'image
 *
 *  \return Retourne l'image copiée
 */
	Image* CopierImage();
/*!
 *  \brief Transforme l'image en GLubyte
 *
 *  Methode qui permet de transformer l'image dans un format affichable par OpenGL
 *
 *  \return void
 */
	void toSprite();
/*!
 *  \brief Afficher l'image
 *
 *  Methode qui permet d'afficher le sprite de l'image, la methode toSprite doit être appelé préalablement
 *
 *  \return void
 */
	void Afficher();
/*!
 *  \brief Charge une image PPM
 *
 *  Charge une Image PPM dans le pointeur data qui est constitué de largeur*hauteur pixels 24 bits (RVB)
 *
 *  \param nom_fichier : nom du fichier à charger
 *
 *  \return Renvoie 0 si le chargement c'est bien passée, -1 sinon
 */
	int chargePPM (const char *nom_fichier);
/*!
 *  \brief Sauve une image PPM
 *
 *  Enregistre sur le disque l'image au format PPM
 *
 *  \param nom_fichier : nom du fichier de sauvegarde
 *  
 *  \return Renvoie 0 si la sauvegarde c'est bien passée, -1 sinon
 */
	int sauvePPM (const char *nom_fichier);
/*!
 *  \brief Acceseur largeur
 *
 *  Renvoie la largeur de l'image
 *  
 *  \return Renvoie la largeur de l'image
 */
	int getL(){return largeur;}
/*!
 *  \brief Acceseur hauteur
 *
 *  Renvoie la hauteur de l'image
 *  
 *  \return Renvoie la hauteur de l'image
 */
	int getH(){return hauteur;}
	
	
private:
	int	largeur; /*!<Largeur de l'image*/
	int	hauteur; /*!<Hauteur de l'image*/
	Pixel* data; /*!<Données de l'image au format largeur*hauteur, chaque composante étant un pixel(R,G,B)*/
	GLubyte* sprite; /*!<Données de l'image au format largeur*hauteur*3, R,V,B,R,V,B,R,V...*/
};

#endif
